package com.java.util;

/**
 * 静态内部类和非静态内部类的测试
 */
public class ClassTest01 {

    public static void main(String[] args) {
        OuterClass outer = new OuterClass();

        System.out.println("----------------- 非静态内部类的实例 -----------------");
        // 创建非静态内部类的实例
        OuterClass.NoStaticInnerClass innerInstance = outer.createNoStaticInnerInstance();
        innerInstance.display();

        System.out.println("-----------------");

        // 直接创建非静态内部类的实例
        OuterClass.NoStaticInnerClass inner = outer.new NoStaticInnerClass();
        inner.display();


        System.out.println("----------------- 静态内部类的实例 -----------------");

        // 创建静态内部类的实例
        OuterClass.StaticInnerClass staticInnerInstance = outer.createStaticInnerInstance();
        staticInnerInstance.display();

        System.out.println("-----------------");

        // 直接创建静态内部类的实例
        OuterClass.StaticInnerClass staticInnerClass = new OuterClass.StaticInnerClass();
        staticInnerInstance.display();

    }


}

class OuterClass {
    private String outerField = "外部类非静态字段";
    private static String staticOuterField = "外部类静态字段";

    /**
     * 非静态内部类
     */
    class NoStaticInnerClass {
        private String innerField = "非静态内部类字段";

        public void display() {
            // 在内部类中可以访问外部类的成员变量和方法
            System.out.println("Outer Field: " + outerField);
            System.out.println("Outer Static Field: " + staticOuterField);
            System.out.println("Inner Field: " + innerField);
        }
    }

    /**
     * 创建非静态内部类的实例
     */
    public NoStaticInnerClass createNoStaticInnerInstance() {
        NoStaticInnerClass inner = new NoStaticInnerClass();
        return inner;
    }

    /**
     * 非静态内部类
     */
    static class StaticInnerClass {
        private String innerField = "静态内部类字段";

        public void display() {
            // 在内部类中可以访问外部类的成员变量和方法
//            System.out.println("Outer Field: " + outerField); // 这个会报错，因为静态内部类不能访问非静态成员变量 outerField
            System.out.println("Outer Field: " + staticOuterField); // 这个会报错，因为静态内部类可以访问静态成员变量 staticOuterField
            System.out.println("Inner Field: " + innerField);
        }
    }


    /**
     * 创建非静态内部类的实例
     */
    public StaticInnerClass createStaticInnerInstance() {
        StaticInnerClass inner = new StaticInnerClass();
        return inner;
    }
}

